package org.wjk.utils;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.Set;

@Component
@RequiredArgsConstructor
@Slf4j
public class JedisUtils {
    private final JedisPool pool;

    public boolean exitKey(String key) {
        /*作用：查询redis中是否存在指定的key，如果存在返回true，如果不存在返回false*/
        Jedis jedis = pool.getResource();
        Boolean exist = jedis.exists(key);
        jedis.close();
        return exist;
    }

    /*不需要将redis的执行结果反馈给前端，那么考虑使用子线程完成该操作*/
    @Async("xfcimsThreadPool")
    //该注解描述方法，springboot会单独从线程池中获取一个线程去执行，value属性值指定了从哪个线程池获取线程
    // 如果不给该注解的value赋值，springboot会从tomcat自身线程池中获取线程
    //该注解的使用需要在某一配置类上@EnableAsync：作用：支持springboot多线程运行
    public void set(byte[] key, byte[] value) {
        Jedis jedis = pool.getResource();
        String res = jedis.set(key, value);
        log.debug("缓存数据到redis里，key为{}，value为{}，执行结果是{}", key, value, res);
        jedis.close();
    }

    public byte[] get(byte[] key) {
        Jedis jedis = pool.getResource();
        byte[] res = jedis.get(key);
        jedis.close();
        return res;
    }

    public String get(String key) {
        Jedis jedis = pool.getResource();
        String value = jedis.get(key);
        jedis.close();
        return value;
    }

    @Async("xfcimsThreadPool")
    public void incr(String key) {
        Jedis jedis = pool.getResource();
        long res = jedis.incr(key);
        log.debug("JedisUtils::incr()调用了，缓存key{}，执行结果为{}", key, res);
        jedis.close();
    }

    @Async("xfcimsThreadPool")
    public void delete(String key) {
        Jedis jedis = pool.getResource();
        Long res = jedis.del(key);
        log.debug("JedisUtils::delete()调用删除缓存，缓存的key{},执行结果{}", key, res);
        jedis.close();
    }

    @Async("xfcimsThreadPool")
    public void deleteKes(String key) {
        /*逻辑：
         * 获取所有包含指定字符串的所有key
         * */
        Jedis jedis = pool.getResource();
        Set<String> keys = jedis.keys(key);
        log.debug("所有带有{}的key为", keys);
        if (keys.isEmpty()) {
            jedis.close();
            return;
        }
        jedis.del(keys.toArray(new String[0]));
        jedis.close();
    }

}
